﻿/***************************************
 * Poton Ver 2.1
 * Copyright (c) 2008-2010 Beta.Ito
 * The zlib/libpng license.
 **************************************/

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
using System.Configuration;
using System.Text;
using System.Configuration.Install;
using Betarium.PotonEditor.Properties;

//todo:メニューのグレー表示
//todo:右クリックでの描画対応
//todo:テキスト入力
//todo:同一色塗りつぶし
//todo:アルファの変更
//todo:表示のアルゴリズム変更

//todo:角度入力回転
//todo:選択範囲の拡張
//todo:同じ色の選択
//todo:グラデーション
//todo:カーソルの変更
//todo:グリッドの表示
//todo:アイコンの保存
//todo:印刷
//todo:モザイク
//todo:ぼかし

/*
 //カーソル変更
private void button1_Click(object sender, System.EventArgs e)
{
if (Cursor == Cursors.Default)
{
System.Reflection.Assembly asm =
  System.Reflection.Assembly.GetExecutingAssembly();
using (System.IO.Stream st = asm.GetManifestResourceStream
	  ("YourNamespace.Cursor1.cur"))
  Cursor = new Cursor(st);
}
else
{
Cursor = Cursors.Default;
}
}

 */

namespace Betarium.PotonEditor
{
	static class Program
	{
		static void OnException(object sender, ThreadExceptionEventArgs e)
		{
			if (e.Exception is ApplicationException)
			{
				ApplicationException ae = (ApplicationException)e.Exception;
				Utility.ReportException(ae);
				return;
			}
//			Utility.ReportException(new ApplicationException("エラーが発生したため終了します。\n" + e.Exception.Message, e.Exception));
			throw e.Exception;
		}
		static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
		{
			if (e.ExceptionObject is ApplicationException)
			{
				ApplicationException ae = (ApplicationException)e.ExceptionObject;
				Utility.ReportException(ae);
				return;
			}
			if (e.ExceptionObject is Exception)
			{
				ApplicationException ae = new ApplicationException("不明な例外が発生しました。", (Exception)e.ExceptionObject);
				Utility.ReportException(ae);
				throw (Exception)e.ExceptionObject;
			}
			throw new ApplicationException("不明な例外が発生しました。");
		}

		[DllImport("mscms.dll")]
		extern static int GetStandardColorSpaceProfile(IntPtr nMachine, uint nColorSpace, [MarshalAs(UnmanagedType.LPStr)] StringBuilder sName, ref uint nSize);

		/// <summary>
		/// アプリケーションのメイン エントリ ポイントです。
		/// </summary>
		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.ThreadException += OnException;
#if !DEBUG
			Thread.GetDomain().UnhandledException += OnUnhandledException;
#endif
			/*
			uint nProfile = (((uint)('W') << 24) | ((uint)('i') << 16) | ((uint)('n') << 8) | (uint)(' ')); //'Win '
			StringBuilder sProfileName = new StringBuilder();
			sProfileName.Length = 256;
			uint nPofileNameLen = (uint)sProfileName.Length - 1;
			GetStandardColorSpaceProfile(IntPtr.Zero, nProfile, sProfileName, ref nPofileNameLen);
			*/
			Settings.Default.ProductVersion = Application.ProductVersion;

			string[] aCommand = Environment.GetCommandLineArgs();
			if (aCommand.Length >= 2 && aCommand[1].StartsWith("/regist_extensions"))
			{
				const string sCommandKey = "poton";
				const string sCommandName = "Potonで編集(&E)";
				string sCommandPath = String.Format("\"{0}\" \"{1}\"", Application.ExecutablePath, "%1");
				string sLoadFileExts = Settings.Default.LoadFileExts;
				if (aCommand[1].IndexOf("=0") > 0)
				{
					foreach (string sFileExt in sLoadFileExts.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
					{
						Utility.UnregistFileType(sFileExt, sCommandKey);
					}
				}
				else if(aCommand[1].IndexOf("=2") > 0)
				{
					foreach (string sFileExt in sLoadFileExts.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
					{
						Utility.RegistFileType(sFileExt, sCommandKey, sCommandName, sCommandPath, true);
					}
				}
				else
				{
					foreach (string sFileExt in sLoadFileExts.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries))
					{
						Utility.RegistFileType(sFileExt, sCommandKey, sCommandName, sCommandPath, false);
					} 
				}
				return;
			}
			
			Application.Run(new MainForm());

			/*
#if DEBUG
#else
			try
			{
				Application.Run(new MainForm());
			}
			catch (UserException ae)
			{
				System.Diagnostics.Trace.WriteLine(ae);
				string sMessage = "アプリケーションエラーが発生しました。\n";
				sMessage += "プログラムを終了します。\n\n";
				sMessage += "＜エラー内容＞\n";
				sMessage += ae.Message;
				sMessage += "\n\n";
				sMessage += "＜エラー箇所＞\n";
				sMessage += ae.Source;
				Utility.Message(sMessage);
				throw ae;
			}
#endif
			*/
			Settings.Default.Save();
		}

	}
}